package com.sun.mybatisplus.bean.dto;

import cn.hutool.core.date.DateUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

@Data
public class SynBudgetDTO implements Serializable{

    /**
     * 指标id（报销系统）
     */
    private String id;
    /**
     * 父级指标id
     */
    private String parentId;
    /**
     * 指标总额度
     */
    private BigDecimal totalAmount;
    /**
     * 累计登记金额（计划批复金额）：此值只有财政指标有，分解后的指标此值为0
     */
    private BigDecimal registerAmount;
    /**
     * 已使用金额
     */
    private BigDecimal usedAmount;
    /**
     * 可用金额
     */
    private BigDecimal availableAmount;
    /**
     * 支出功能分类科目代码
     */
    private String expFuncCode;
    /**
     * 支出功能分类科目名称
     */
    private String expFuncName;
    /**
     * 政府支出经济分类代码
     */
    private String govBgtEcoCode;
    /**
     * 政府支出经济分类名称
     */
    private String govBgtEcoName;
    /**
     * 预算年度
     */
    private String budgetYear;
    /**
     * 项目代码
     */
    private String proCode;
    /**
     * 项目名称
     */
    private String proName;
    /**
     * 预算单位id（报销系统）
     */
    private String bgtOrgId;
    /**
     * 单位代码
     */
    private String bgtOrgCode;
    /**
     * 预算单位名称（报销系统）
     */
    private String bgtOrgName;
    /**
     * 指标id（一体化）
     */
    private String bgtId;
    /**
     * 支付系统返回的冗余字段
     */
    private String otherData;
    /**
     * 财政区划代码
     */
    private String mofDivCode;
    /**
     * 源指标id
     */
    private String oriBgtId;
    /**
     * 指标更新时间
     */
    private Long lastVersion;
    /**
     * 本级指标文号
     */
    private String fileNo;
    /**
     * 指标文标题
     */
    private String bgtDocTitle;
    /**
     * 发文时间
     */
    private Date docDate;
    /**
     * 调减（追减）金额
     */
    private BigDecimal disAmt;
    /**
     * 资金性质代码
     */
    private String fundTypeCode;
    /**
     * 资金性质名称
     */
    private String fundTypeName;
    /**
     * 顶级指标ID（即财政部下达的指标），parentId = 0 时，此值为0
     */
    private Long topLevelBudget;
    /**
     * 预算项目
     */
    private String project;
    /**
     * 备注
     */
    private String memo;
    /**
     * 附件数组
     */
    private JSONArray files;
    /**
     * 删除标志
     */
    private Byte deleted;
    /**
     * 编号
     */
    private String code;
    /**
     * 已占用额度
     */
    private BigDecimal occupyAmount;
    /**
     * 批复类型/指标类型
     */
    private String approvalType;
    /**
     * 支出类型
     */
    private String payType;
    /**
     * 項目类型
     */
    private String projectType;
    /**
     * 发布状态
     */
    private Integer status;
    private String innerProjectName;
    private Long innerProject;

    @TableField(exist = false)
    private JSONArray items;
    @TableField(exist = false)
    private JSONArray depts;
    private static final long serialVersionUID = 1L;

    public void setDocDate(Date docDate) {
        this.docDate = docDate;
        this.arriveDate = DateUtil.format(docDate, "yyyy-MM-dd");
    }



    public void setFunctionalSubjects(String functionalSubjects) {
        Map.Entry<String, Object> subject = JSONUtil.parseObj(functionalSubjects).entrySet().iterator().next();
        this.expFuncCode = subject.getKey();
        this.expFuncName = subject.getValue().toString();
    }

    public String getFunctionalSubjects() {
        return getJsonObj(this.expFuncCode, this.expFuncName);
    }

    public void setGovEconSubjects(String govEconSubjects) {
        Map.Entry<String, Object> subject = JSONUtil.parseObj(govEconSubjects).entrySet().iterator().next();
        this.govBgtEcoCode = subject.getKey();
        this.govBgtEcoName = subject.getValue().toString();
    }

    public String getGovEconSubjects() {
        return getJsonObj(this.govBgtEcoCode, this.govBgtEcoName);
    }



    private String getJsonObj(String code, String name) {
        Map<String, String> tempMap = new HashMap<>();
        tempMap.put(code, name);
        return JSONUtil.toJsonStr(tempMap);
    }


    @TableField(exist = false)
    private String arriveDate;
    @TableField(exist = false)
    private String budgetOrg;
    @TableField(exist = false)
    private String budgetOrgId;
    @TableField(exist = false)
    private String capitalNature;


}
